package com.project.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import com.project.bean.MonthlyMoneyBean;
import com.project.bean.OrderBean;
import com.project.bean.UserBean;
import com.project.service.IOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.time.LocalDate;
import java.util.List;

/**
 * @Author(王思翰)
 * @Description(类的描述)
 * @Date(创建时间) 2021/8/2 16:43
 */
@RestController
@RequestMapping("order")
public class OrderController {
    @Autowired
    private IOrderService service;

    /**
     * 结账
     * 首先，完成订单的添加，并且记录该订单的id
     * 根据订单中的用户id，或者session中取出，查询购物车中的购物集合
     * 将购物集合中的信息，进行遍历，添加订单明细表
     * 删除该用户的购物集合
     *
     * @param orderBean 订单对象
     */
    @RequestMapping("add")
    public String add(@Valid OrderBean orderBean, BindingResult result, HttpServletRequest request
            ) throws JsonProcessingException {
        if (result.hasErrors()){//判断是否有出错信息
            //取出出错信息集合
            List<FieldError> errorList=result.getFieldErrors();
            String str=new ObjectMapper().writeValueAsString(errorList);
            return str;
        }
        UserBean userBean= (UserBean) request.getSession().getAttribute("loginUserBean");
        service.add(orderBean,userBean.getId());
        return "ok";
    }

    /**
     * 动态分页查询所有订单信息
     * 同时查询出所有订单的订单详情
     * 按状态和日期进行排序
     *
     * @param pageNo    页码
     * @param status    状态
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param id 用户id
     * @return 分页对象
     */
    @RequestMapping("findByItemAdmin")
    public PageInfo<OrderBean> findByItemAdmin(int pageNo
            , String status, LocalDate startDate
            , LocalDate endDate, Integer id){
       return service.findByItemAdmin(pageNo,status,startDate,endDate,id);
    }

    /**
     * 查询订单详情。同时查询订单明细，在订单明细信息中，需要查询商品信息
     *
     * @param id 订单id
     * @return 订单对象
     */
    @RequestMapping("findById")
    public OrderBean findById(int id){
        return service.findById(id);
    }

    /**
     * 管理员
     * 根据订单id，将该订单的状态改为"发货中"
     *
     * @param id     订单id
     */
    @RequestMapping("send")
    public String send(int id){
        service.send(id);
        return "ok";
    }

    /**
     * 送货员结账
     * 根据订单id，将该订单的状态改为"已完结"
     *
     * @param id     订单id
     */
    @RequestMapping("finish")
    public String finish(int id){
        service.finish(id);
        return "ok";
    }

    /**
     * 送货员
     * 查询所有的“发货中”的订单信息
     *
     * @return 订单集合
     */
    @RequestMapping("findByItemDeBoy")
    public List<OrderBean> findByItemDeBoy(){
       return service.findByItemDeBoy();
    }

    /**
     * 按时间返回当年所有月份的销售金额
     */
    @RequestMapping("findByDate")
    public List<MonthlyMoneyBean> findByDate(String date){
        LocalDate start=LocalDate.parse(date+"-01-01");
        LocalDate end=LocalDate.parse(date+"-12-31");
        return service.findByDate(start,end);
    }
}
